home *** CD-ROM | disk | FTP | other *** search
/ Nebula 2 / Nebula Two.iso / SourceCode / GameKit / gamekit-1 / HighScoreSlot.m < prev    next >
Text File  |  1995-06-12  |  6KB  |  224 lines

  1.  
  2. #import <remote/NXProxy.h>
  3. #import <gamekit/gamekit.h>
  4. #import <daymisckit/daymisckit.h>
  5. #import <appkit/appkit.h>
  6. #import <objc/typedstream.h>    // highscore tables
  7.  
  8. @implementation HighScoreSlot
  9.  
  10. + initialize
  11. {
  12.     if (self == [HighScoreSlot class]) {
  13.         [HighScoreSlot setVersion:GKHighScoreSlot_VERSION];
  14.     }
  15.     return self;
  16. }
  17.  
  18. - init    // implement to generate an empty slot for server
  19. {
  20.     return [self initName:"Nobody" score:0];
  21. }
  22.  
  23. - initName:(const char *)initName score:(int)initScore
  24. {    // for games that don't use the level variable
  25.     return [self initName:initName score:initScore endLevel:0];
  26. }
  27.  
  28. - initName:(const char *)initName score:(int)initScore endLevel:(int)initLevel
  29. {    // designated initializer
  30.     [super init];
  31.     playerName =  [[DAYString allocFromZone:[self zone]]
  32.             initString:initName];
  33.     endLevel = initLevel;
  34.     finalScore  = initScore;
  35.     // make a bunch of empty objects.
  36.     startTime =   [[DAYTime      allocFromZone:[self zone]] init];
  37.     endTime =     [[DAYTime      allocFromZone:[self zone]] init];
  38.     elapsedTime = [[DAYStopwatch allocFromZone:[self zone]] init];
  39.     userName =    [[DAYString    allocFromZone:[self zone]] init];
  40.     machineName = [[DAYString    allocFromZone:[self zone]] init];
  41.     return self;
  42. }
  43.  
  44. - dumpToLog:aLogFile    // used by server when logging
  45. {    // aLogFile must be a kind of the DAYLogFile class
  46.     char *string = (char *)malloc(256);
  47.     id tempString = [[DAYString alloc] init];
  48.     sprintf(string, "    finalScore = %d    startLevel = %d    endLevel = %d\n    startTime = \"%s\"    endTime = \"%s\"    elapsedTime = \"%s\"\n    playerName = \"%s\"    userName = \"%s\"    machineName = \"%s\"\n",
  49.             finalScore, startLevel, endLevel,
  50.             [startTime stringValue], [endTime stringValue],
  51.             [elapsedTime stringValue], [playerName stringValue],
  52.             [userName stringValue], [machineName stringValue]);
  53.     [tempString setStringValue:string];
  54.     [aLogFile addLineToLogFile:tempString];
  55.     free(string);
  56.     [tempString free];
  57.     return self;
  58. }
  59.  
  60. - free
  61. {    // free all the sub-objects.
  62.     [startTime free]; [endTime free];
  63.     [elapsedTime free]; [playerName free];
  64.     [userName free]; [machineName free];
  65.     return [super free];
  66. }
  67.  
  68. // The following methods access value of the slot.
  69. - (const char *)playerName { return [playerName stringValue]; }
  70. - (const char *)userName { return [userName stringValue]; }
  71. - (const char *)machineName { return [machineName stringValue]; }
  72. - (int)finalScore { return finalScore; }
  73. - (int)startLevel { return startLevel; }
  74. - (int)endLevel { return endLevel; }
  75. - startTime { return startTime; }
  76. - endTime { return endTime; }
  77. - elapsedTime { return elapsedTime; }
  78.  
  79. // The following methods change the values of the slot.
  80. - setFinalScore:(int)t { finalScore = t; return self; }
  81. - setStartLevel:(int)t { startLevel = t; return self; }
  82. - setEndLevel:(int)t { endLevel = t; return self; }
  83.  
  84. - setPlayerName:(const char *)t
  85. {
  86.     [playerName setStringValue:t];
  87.     return self;
  88. }
  89.  
  90. - setUserName:(const char *)t
  91. {
  92.     [userName setStringValue:t];
  93.     return self;
  94. }
  95.  
  96. - setMachineName:(const char *)t
  97. {
  98.     [machineName setStringValue:t];
  99.     return self;
  100. }
  101.  
  102. - setStartTime:aTime
  103. {
  104.     if (startTime) [startTime free];
  105.     startTime = aTime;
  106.     return self;
  107. }
  108.  
  109. - setEndTime:aTime
  110. {
  111.     if (endTime) [endTime free];
  112.     endTime = aTime;
  113.     return self;
  114. }
  115.  
  116. - setElapsedTime:aTime
  117. {
  118.     if (elapsedTime) [elapsedTime free];
  119.     elapsedTime = aTime;
  120.     return self;
  121. }
  122.  
  123. - (BOOL)isAbove:aSlot
  124. {    // override this if you want a custom ordering of slots
  125.     if (finalScore > [aSlot finalScore]) return YES;
  126.     return NO;
  127. }
  128.  
  129. // for archiving to/from a file
  130. - read:(NXTypedStream *)stream
  131. {
  132.     [super read:stream];
  133.     if (NXTypedStreamClassVersion(stream, "HighScoreSlot") ==
  134.             [HighScoreSlot version]) { // current version read code
  135.         NXReadTypes(stream, "iii", &finalScore, &startLevel, &endLevel);
  136.         startTime = NXReadObject(stream);
  137.         endTime = NXReadObject(stream);
  138.         elapsedTime = NXReadObject(stream);
  139.         playerName = NXReadObject(stream);
  140.         userName = NXReadObject(stream);
  141.         machineName = NXReadObject(stream);
  142.     } else { // read old version
  143.         int pos;    //  a throwaway
  144.         char *tmpStr = malloc(1024); // should be plenty big
  145.         [self init]; // clear all ivars before reading in new
  146.         NXReadTypes(stream, "iii*", &pos, &endLevel, &finalScore, &tmpStr);
  147.         [playerName setStringValue:tmpStr];
  148.         free(tmpStr);
  149.     }
  150.     return self;
  151. }
  152.  
  153. - write:(NXTypedStream *)stream
  154. {
  155.     [super write:stream];
  156.     NXWriteTypes(stream, "iii", &finalScore, &startLevel, &endLevel);
  157.     NXWriteObject(stream, startTime);
  158.     NXWriteObject(stream, endTime);
  159.     NXWriteObject(stream, elapsedTime);
  160.     NXWriteObject(stream, playerName);
  161.     NXWriteObject(stream, userName);
  162.     NXWriteObject(stream, machineName);
  163.     return self;
  164. }
  165.  
  166. // NXTransport protocol implementation:
  167. - encodeUsing:(id <NXEncoding>)portal
  168. {
  169.     [portal encodeObjectBycopy:startTime];
  170.     [portal encodeObjectBycopy:endTime];
  171.     [portal encodeObjectBycopy:elapsedTime];
  172.     [portal encodeObjectBycopy:playerName];
  173.     [portal encodeObjectBycopy:userName];
  174.     [portal encodeObjectBycopy:machineName];
  175.     [portal encodeData:&finalScore ofType:"i"];
  176.     [portal encodeData:&startLevel ofType:"i"];
  177.     [portal encodeData:&endLevel ofType:"i"];
  178.     return self;
  179. }
  180.  
  181. - decodeUsing:(id <NXDecoding>)portal
  182. {
  183.     startTime = [portal decodeObject];
  184.     endTime = [portal decodeObject];
  185.     elapsedTime = [portal decodeObject];
  186.     playerName = [portal decodeObject];
  187.     userName = [portal decodeObject];
  188.     machineName = [portal decodeObject];
  189.     [portal decodeData:&finalScore ofType:"i"];
  190.     [portal decodeData:&startLevel ofType:"i"];
  191.     [portal decodeData:&endLevel ofType:"i"];
  192.     return self;
  193. }
  194.  
  195. - encodeRemotelyFor:(NXConnection *)connection
  196.     freeAfterEncoding:(BOOL *)flagp isBycopy:(BOOL)isByCopy
  197. {
  198.     if (isByCopy) {
  199.         *flagp = NO; // object will copy.
  200.         return self; //encode object (copy it)
  201.     }
  202.     *flagp = NO; // object will copy.
  203.     // super will encode the proxy otherwise
  204.     return [super encodeRemotelyFor:connection
  205.                 freeAfterEncoding:flagp isBycopy:isByCopy];
  206. }
  207.  
  208. - copy
  209. { // this is to make sure that the id instance vars are actually _copied_
  210.     id newObj = [[[self class] alloc] init];
  211.     [newObj setPlayerName:[self playerName]];
  212.     [newObj setUserName:[self userName]];
  213.     [newObj setMachineName:[self machineName]];
  214.     [newObj setStartTime:[[self startTime] copy]];
  215.     [newObj setEndTime:[[self endTime] copy]];
  216.     [newObj setElapsedTime:[[self elapsedTime] copy]];
  217.     [newObj setFinalScore:[self finalScore]];
  218.     [newObj setStartLevel:[self startLevel]];
  219.     [newObj setEndLevel:[self endLevel]];
  220.     return newObj;
  221. }
  222.  
  223. @end
  224.